import numpy as np
import matplotlib.pyplot as plt

# 设置中文字体为宋体
plt.rcParams['font.sans-serif'] = ['SimSun']  # 使用宋体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号

# 生成数据
x = np.linspace(-1.5 * np.pi, 1.5 * np.pi, 100)
y1 = 1.5 - 1.2 * (x - 1)**2
y2 = x**4 - 4*x**3 + 2*x**2 + 10
random_x = np.random.uniform(-1.5 * np.pi, 1.5 * np.pi, 25)
random_y = np.random.uniform(-20, 20, 25)

# 绘制图像
plt.figure(figsize=(12, 6))
plt.title("函数图")
plt.xlabel("时间")
plt.ylabel("函数值")

# 散点图
plt.scatter(random_x, random_y, label='随机点', color='red')

# 绘制 y1 和 y2
plt.plot(x, y1, 'g-', label='y1 = 1.5 - 1.2(x-1)^2')
plt.plot(x, y2, 'b--', label='y2 = x^4 - 4x^3 + 2x^2 + 10')

# 参考线和阴影区域
plt.axhline(y=-1.5, color='grey', linestyle='--', linewidth=2)
plt.axhline(y=1.5, color='grey', linestyle='-.', linewidth=2)
plt.axvspan(0.5, 1.5, color='#B0C4DE', alpha=0.3)

# 标注最大值和最小值
y1_max = (x[np.argmax(y1)], y1.max())
y1_min = (x[np.argmin(y1)], y1.min())
y2_max = (x[np.argmax(y2)], y2.max())
y2_min = (x[np.argmin(y2)], y2.min())

plt.annotate(f'最大值 y1: {y1_max[1]:.2f}', xy=y1_max, xytext=(y1_max[0]+0.5, y1_max[1]+5),
             arrowprops=dict(facecolor='green', shrink=0.05))
plt.annotate(f'最小值 y1: {y1_min[1]:.2f}', xy=y1_min, xytext=(y1_min[0]+0.5, y1_min[1]-5),
             arrowprops=dict(facecolor='green', shrink=0.05))
plt.annotate(f'最大值 y2: {y2_max[1]:.2f}', xy=y2_max, xytext=(y2_max[0]+0.5, y2_max[1]+5),
             arrowprops=dict(facecolor='blue', shrink=0.05))
plt.annotate(f'最小值 y2: {y2_min[1]:.2f}', xy=y2_min, xytext=(y2_min[0]+0.5, y2_min[1]-5),
             arrowprops=dict(facecolor='blue', shrink=0.05))

# 突出显示特定点 (1, 1.5)
plt.plot(1, 1.5, 'o', label='(1, 1.5)')

# 网格和图例
plt.grid(True)
plt.legend()

# 设置 x 和 y 轴的范围
plt.xlim([-1.5 * np.pi, 1.5 * np.pi])
plt.ylim([-20, 20])

# 显示图像
plt.show()
